<?php
/**
 * Created by PhpStorm.
 * User: 554665488
 * Date: 2018-6-20
 * Time: 21:28
 * @description: 装饰器模式 demo 案例：假如要改变一个类的某一个功能的方法。传统的做法是继承这个类 ，在子类中去重新这个方法 .如果要改写这个方法的功能 要重新好多次（太麻烦）.
 *  装饰器模式灵活的解决这个问题 重写这个方法的功能 对代码解耦
 * @Author: yfl
 * @QQ 554665488
 */


use DesignModel\decorator\Decoretor2;

define('BASEDIR', __DIR__ . '/..');


require_once __DIR__ . '/Loader.php';
spl_autoload_register("\\DesignModel\\Loader::autoload");


//方式一.传统的方式
class Canvas1 extends \DesignModel\decorator\Canvas2
{
    //假如要改变一个类的某一个功能的方法。传统的做法是继承这个类 ，在子类中去重新这个方法
    public function draw()
    {
        echo "<div style='color: aqua'>";
        parent::draw(); // TODO: Change the autogenerated stub
        echo "</div>";
    }
}

//$obj = new Canvas1();
//
//$obj->init();
//
//$obj->rect(3, 6, 5, 14);
//
//$obj->draw();

//方式二 使用装饰器模式 使用装饰器模式改变一个类中的某一个方法的功能  实现上边的方法 对代码进行解耦
echo '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' . '<br/>';


$obj2 = new \DesignModel\decorator\Canvas3();

$obj2->setDecorators(new \DesignModel\decorator\ColorDecorator('green')); //这样就可以非常方便改变一个类中某一个方法的功能
//$obj2->setDecorators(new \DesignModel\decorator\ColorDecorator('coral')); //这样就可以非常方便改变一个类中某一个方法的功能同时开可以方便的取消这个的动作

$obj2->setDecorators(new Decoretor2(['width'=>'100px']));
$obj2->init();
$obj2->rect(3, 6, 5, 14);
$obj2->draw();





